package driver;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;

import classes.Activitat;
import classes.Agenda;
import classes.Any;
import classes.Calendari;
import classes.Dia;
import classes.Espai;
import classes.Hora;
import classes.Mes;
import driver.Configuracio;
import driver.GenerarSortida;
import driver.Utilitats;

public class GeneradorHTML implements GenerarSortida {

	private Agenda agenda;
	private Configuracio configuracioActual;

	private String miTitulo;
	private String miSemana;
	private CrearFitxerHTML miHTML;

	String vacio = "&nbsp;";
	private Map<Utilitats.DiesSetmana, String> mapaDies;

	public GeneradorHTML(Agenda agenda, Configuracio configuracioActual) {
		super();
		this.agenda = agenda;
		this.configuracioActual = configuracioActual;
		miTitulo = configuracioActual.getCampsOUT().getStrTitol();
		miSemana = configuracioActual.getCampsOUT().getStrSetmana();
		mapaDies = configuracioActual.getCampsOUT().getMapStrDiesSetmana();
		miHTML = new CrearFitxerHTML();
	}

	@Override
	public void imprimirAgenda() {

		for (Espai e : agenda.getLlistaEspais()) {
			System.out.println(e);
			miHTML.crearNouHTML(e.getNom());
			imprimirTitols(e);
			imprimirEspai(e);
			imprimirFinals();
		}

	}

	private void imprimirTitols(Espai esp) {
		String texto = "<html>\n" + " <head><title>" + miTitulo
				+ "<head></title>\n";
		texto += "<body style=\"font-family: Verdana; font-size:10pt\">\n";
		texto += "<h1 align=center>" + esp.getNom() + "</h1>\n";
		texto += "<h2 align=center>" + configuracioActual.getMes()
				+ configuracioActual.getAny() + " </h2>\n";
		texto += "<br> \n\n";

		miHTML.grabarText(texto);

	}

	private void imprimirFinals() {

		String texto = "\n" + "\n" + "<p>&nbsp;</p><p>&nbsp;</p>" + "\n";

		texto += "<table style=\"font-size: 10pt\" cellspacing=\"2\">" + "\n";

		texto += "<tr><td>Generated by:</td><td>g_agenda</td></tr>" + "\n";
		texto += "<tr><td>17:49 07/06/2011</td></tr>" + "\n";
		texto += "<tr><td colspan=\"2\"><hr size=\"1\"></td></tr>" + "\n";
		texto += "</table>" + "\n" + "\n" + "\n";
		texto += "</td></tr></table></center>" + "\n";
		texto += "</body>" + "\n";
		texto += "</html>" + "\n";

		miHTML.grabarText(texto);

	}

	private void imprimirEspai(Espai esp) {

		Calendar dataActual = Calendar.getInstance();

		dataActual.set(Calendar.YEAR, configuracioActual.getAny());
		dataActual.set(Calendar.MONTH, configuracioActual.getMes() - 1);
		dataActual.set(Calendar.DATE, 1);

		Calendar dataFi = Calendar.getInstance();

		dataFi.set(Calendar.YEAR, configuracioActual.getAny());
		dataFi.set(Calendar.MONTH, configuracioActual.getMes() - 1);
		dataFi.set(Calendar.DATE,
				dataFi.getActualMaximum(Calendar.DAY_OF_MONTH));

		for (int i = dataActual.get(Calendar.WEEK_OF_YEAR); i < dataFi
				.get(Calendar.WEEK_OF_YEAR) + 1; i++) {

			printSetmana(esp, dataActual, i);
			imprimirFinalSemtmana();

			dataActual.add(Calendar.DATE, 7);
		}
	}

	private void printSetmana(Espai esp, Calendar dataActual,
			int numSetmanaDelAny) {

		int OffsetSetmana = diaSetmana(dataActual);

		printTextSetmana(numSetmanaDelAny);

		Calendar dataIni = Calendar.getInstance();

		dataIni.setTime(dataActual.getTime());

		// Comencem a Imprimir setmana sempre al Dilluns de la setmana de
		// DiaActual
		dataIni.add(Calendar.DATE, -OffsetSetmana);

		printNumDies(dataIni, numSetmanaDelAny);

		for (int j = 0; j < 24; j++) {
			Dia auxDia = new Dia(dataIni.get(Calendar.DATE));
			printFila(auxDia, j, esp, dataIni);
		}

	}

	private Calendar afegirDiaData(Calendar dataIni, int qttAfegir) {
		
		Calendar auxDia = Calendar.getInstance();
		
		auxDia.setTime(dataIni.getTime());
	
		auxDia.add(Calendar.DATE, qttAfegir);

		return auxDia;
	}

	private void printFila(Dia dia, int hora, Espai esp, Calendar dataIni) {
		String texto = "<tr>" + "\n";
		String color = "#E8F1FE";

		texto += "<td style=\"background-color: " + color
				+ "; font-size: 10pt; text-align: center \">" + hora + "-"
				+ (hora + 1) + "</td> ";

		for (int i = 0; i < 7; i++) {

			String nomActivitat = "";
			Dia auxDia = null;
			Hora auxHora = null;
			color = "#b2aaaa";
			Calendari auxCal = esp.getCal();
			Any auxAny = auxCal.getAny(afegirDiaData(dataIni, i).get(
					Calendar.YEAR));
			if (auxAny == null) {
				nomActivitat = "   ";
			} else {
				Mes auxMes = auxAny.getMes(afegirDiaData(dataIni, i).get(
						Calendar.MONTH) + 1);

				if (auxMes == null) {
					nomActivitat = "   ";
				} else {

					auxDia = auxMes.getDia(dia);
					if (auxDia == null) {
						nomActivitat = "Lliure";
						color = "#DFFAC4";
					} else {
						auxHora = auxDia.getHora(new Hora(hora));
						if (auxHora == null) {
							nomActivitat = "Lliure";
							color = "#DFFAC4";
						} else {
							Activitat auxActivitat = auxHora.getActivitat();
							if (auxActivitat == null) {
								// nomActivitat=configuracioActual.getCampsOUT().getStrFree();
								nomActivitat = "Lliure";
								color = "#DFFAC4";
							} else {
								nomActivitat = auxActivitat.getNom();
								String strActivitatTancat = configuracioActual
										.getCampsOUT().getStrTancat()
										.toString();

								if (strActivitatTancat.equals(nomActivitat)) {
									color = "#b2aaaa";
								} else {
									color = "#fbfccf";
								}
							}
						}

					}
				}

				texto += "<td style=\"font-size: 10pt; text-align: center \" bgcolor="
						+ color + ">";
				texto += nomActivitat;
				texto += "</td> ";
			}
		}
		texto += "</tr>";

		miHTML.grabarText(texto);
	}

	private void printNumDies(Calendar dia, int numeroSemanaDelAny) {
		Calendar auxDia = Calendar.getInstance();
		auxDia.set(Calendar.DATE, dia.get(Calendar.DATE));
		auxDia.set(Calendar.MONTH, dia.get(Calendar.MONTH));
		auxDia.set(Calendar.YEAR, dia.get(Calendar.YEAR));

		String texto = "<tr bgcolor=#E8F1FE>\n";
		texto += "<td style=\"text-align: center \">" + numeroSemanaDelAny
				+ "</td>\n";

		for (int i = 0; i < 7; i++) {

			texto += "<td style=\"text-align: center \">"
					+ auxDia.get(Calendar.DATE) + "</td>\n";

			auxDia.add(Calendar.DATE, 1);

		}

		texto += "<tr>\n";

		miHTML.grabarText(texto);

	}

	private void printTextSetmana(int numeroSemanaDelAny) {

		// IMPRIMIM NUMERO DE LA SETMANA

		String texto = "<table align=center width=90% border=1 cellpadding=2 cellspacing=0>";
		texto += "\n <tr bgcolor=#D6E7FA>\n";
		texto += "<td style=\"text-align: center \">" + " " + miSemana + " ";
		texto += "</td>\n";
		texto += "</td> \n";

		// IMPRIMIM ELS DIES DE LA SETMANA QUE ESTAN AL MAPADIES.

		for (Utilitats.DiesSetmana dies : mapaDies.keySet()) {

			texto += "<td style=\"text-align: center \">" + dies + "</td>\n";

		}

		miHTML.grabarText(texto);
	}

	private void imprimirFinalSemtmana() {
		String texto = "</table>" + "\n";
		texto += "<p>&nbsp;</p><p>&nbsp;</p>";

		miHTML.grabarText(texto);

	}

	private int diaSetmana(Calendar dataActual) {

		// Torna de Dilluns = 0 a Diumenge = 6

		int diaSet = dataActual.get(Calendar.DAY_OF_WEEK) - 2;
		if ((dataActual.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)) {
			diaSet = 6;
		}

		return diaSet;
	}

}